#
# @lc app=leetcode.cn id=72 lang=python3
#
# [72] 编辑距离
#
# https://leetcode-cn.com/problems/edit-distance/description/
#
# algorithms
# Hard (52.09%)
# Total Accepted:    9.3K
# Total Submissions: 17.5K
# Testcase Example:  '"horse"\n"ros"'
#
# 给定两个单词 word1 和 word2，计算出将 word1 转换成 word2 所使用的最少操作数 。
# 
# 你可以对一个单词进行如下三种操作：
# 
# 
# 插入一个字符
# 删除一个字符
# 替换一个字符
# 
# 
# 示例 1:
# 
# 输入: word1 = "horse", word2 = "ros"
# 输出: 3
# 解释: 
# horse -> rorse (将 'h' 替换为 'r')
# rorse -> rose (删除 'r')
# rose -> ros (删除 'e')
# 
# 
# 示例 2:
# 
# 输入: word1 = "intention", word2 = "execution"
# 输出: 5
# 解释: 
# intention -> inention (删除 't')
# inention -> enention (将 'i' 替换为 'e')
# enention -> exention (将 'n' 替换为 'x')
# exention -> exection (将 'n' 替换为 'c')
# exection -> execution (插入 'u')
# 
# 
#
class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        row = len(word1)
        col = len(word2)
        dp = [[0] * (col + 1) for _ in range(row+1)]
        # 初始化第一行
        for i in range(1, col+1):
            dp[0][i] = dp[0][i-1] + 1
        # 初始化第一列
        for i in range(1, row+1):
            dp[i][0] = dp[i-1][0] + 1

        for i in range(1, row+1):
            for j in range(1, col+1):
                if word1[i-1] == word2[j-1]:
                    dp[i][j] = dp[i-1][j-1]
                else:
                    #dp[i-1][j]----->dp[i][j], 是删操作
                    #dp[i][j-1]----->dp[i][j], 是增操作
                    #dp[i-1][j-1]--->dp[i][j]，是改操作
                    dp[i][j] = min(dp[i-1][j], dp[i][j-1],dp[i-1][j-1]) + 1
        return dp[-1][-1]
# if __name__ == '__main__':
#     import pdb
#     pdb.set_trace()
#     s = Solution() 
#     s1 = 'horse'
#     s2 = 'ros'          
#     print(s.minDistance(s1, s2))
        
